Imports System.Data.Objects

Public Class DirecciónRepository
    Inherits BaseEntityRepository(Of Dirección)

    Private oSets() As ObjectSet(Of Dirección)

    Public Sub New(ByVal context As AsindoContext)
        MyBase.New(context)
        oSets = {context.Direcciones}
    End Sub

    Public Overrides Function GetID(ByVal obj As Dirección) As Integer
        Return obj.Id
    End Function

    Protected Overrides Function GetByIdQuery(ByVal qbase As IQueryable(Of Dirección), ByVal id As Integer) As IQueryable(Of Dirección)
        Return qbase.Where(Function(r) r.Id = id)
    End Function

    Protected Overrides ReadOnly Property MainObjectSet As ObjectSet(Of Dirección)
        Get
            Return Context.Direcciones
        End Get
    End Property

    Protected Overrides ReadOnly Property ObjectSets As ICollection(Of ObjectSet(Of Dirección))
        Get
            Return oSets
        End Get
    End Property

    Public Function EncontrarVias(ByVal term As String) As String()
        Dim q = From d In All()
                Where d.Vía.Contains(term)
                Select d.Vía
                Take 10

        Return q.Distinct.ToArray
    End Function

    Public Function EncontrarDirecciones(ByVal term As String) As Array
        Dim q = From d In All()
        Where d.Vía.Contains(term)
        Select d
        Take 10

        Return q.ToList.Select(Function(d) New With {.id = d.Id, .label = d.Completa(), .muestra = d.Completa2("<br />")}).ToArray
    End Function

    Public Function GetEqual(ByVal otra As Dirección) As Dirección
        Return QueryEqual(otra).SingleOrDefault
    End Function

    Public Function ExistsEqual(ByVal otra As Dirección) As Boolean
        Return QueryEqual(otra).Any
    End Function

    Private Function QueryEqual(ByVal otra As Dirección) As IQueryable(Of Dirección)
        Dim q = From dirección In All()
                Where
                dirección.TipoVíaId = otra.TipoVíaId AndAlso
                dirección.Vía = otra.Vía AndAlso
                dirección.PoblaciónId = otra.PoblaciónId AndAlso
                dirección.Número = otra.Número

        If otra.Portal Is Nothing Then
            q = q.Where(Function(direc) direc.Portal = "" OrElse direc.Portal Is Nothing)
        Else
            q = q.Where(Function(direc) direc.Portal = otra.Portal)
        End If
        If otra.Piso Is Nothing Then
            q = q.Where(Function(direc) direc.Piso Is Nothing)
        Else
            q = q.Where(Function(direc) direc.Piso.Value = otra.Piso.Value)
        End If
        If otra.Letra Is Nothing Then
            q = q.Where(Function(direc) direc.Letra = "" OrElse direc.Letra Is Nothing)
        Else
            q = q.Where(Function(direc) direc.Letra = otra.Letra)
        End If
        If otra.CódigoPostal Is Nothing Then
            q = q.Where(Function(direc) direc.CódigoPostal = "" OrElse direc.CódigoPostal Is Nothing)
        Else
            q = q.Where(Function(direc) direc.CódigoPostal = otra.CódigoPostal)
        End If

        Return q
    End Function
    ''' <summary>
    ''' Si la dirección ya está en la BD, devuelve la dirección de la BD (ya en contexto y como objeto proxy)
    ''' Si no, la añade al contexto y la devuelve tal cual
    ''' </summary>
    ''' <param name="direcForm"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function AddIfNotExists(ByVal direcForm As Dirección, Optional ByVal save As Boolean = False) As Dirección
        Dim direcBD = GetEqual(direcForm)

        If direcBD Is Nothing Then
            Add(direcForm, save)
        Else
            If direcForm.EntityState <> EntityState.Detached Then
                Context.Direcciones.Detach(direcForm)
            End If
            direcForm = direcBD
        End If

        Return direcForm
    End Function

    Public Sub BorrarHuérfanas()
        Dim huérfanas = All.Where(Function(direc) direc.Personas.Count = 0 AndAlso direc.Avisos.Count = 0)
        For Each huérfana In huérfanas
            Delete(huérfana, save:=False)
        Next
    End Sub

    Public Overrides Function CreateDetached() As Dirección
        Return New Dirección
    End Function
End Class
